﻿// Copyright: 北京经海科技有限公司
// Author: Ivan (李渊)
// Date: 2015-03-01
// Last Modified: 2015-05-22
// Description: 用于显示CCD采集的图像，并可以在上面增加各种标注

#ifndef DISPLAY_WIDGET_H
#define DISPLAY_WIDGET_H

#include <QWidget>
#include <QPointF>
#include <QFont>
#include <QPen>
#include <QColor>
#include <QList>

#include "ImageView.h"
#include "element.h"
#include "DrawRuler.h"

namespace Qly
{
const int DEFAULT_LINE_WIDTH = 3;
const int DEFAULT_FONT_SIZE = 18;

class DisplayWidget : public ImageView
{
    Q_OBJECT
public:

    void setLeftRect(QRect rect) {m_leftRect = rect;}
    void setRightRect(QRect rect) {m_rightRect = rect;}
    QRect m_leftRect;
    QRect m_rightRect;

    DisplayWidget(QWidget *parent = 0);
    ~DisplayWidget();
    QImage getImage(bool withMark); // 获取图像，可以带图形元素
    double getLength(bool &ok); // 获得最后一个图形元素的尺寸，可以是直线或者圆
    Element *findShape(const QPointF &pt); // 获得 pt 所在区域的元素指针
public slots:
    /**
    * @brief 将当前图像保存到文件中
    * @param fileName 带路径的完整文件名
    * @param checked 是否保存标注
    * @return true 表示保存成功，false 表示保存失败
    */
    bool saveImage(const QString & fileName, bool checked);
    void clearAll(void); //清除所有图上的元素
    void setScale(double scale); // 设置标尺系数，会更新所有的元素的标注尺寸
    void setColor(const QColor color); //设置 pen 的颜色
    void setTextSize(int width); // 设置文字大小
    void setLineWidth(int width); // 设置 pen 的线宽
    void addCircle(QPoint center, double radius);// 添加一个圆
    void setDrawType(enum Element::DrawType type);
    void setClibMode(void);
    void undo(void);
signals:
    void newElement(Element * e); // 每次画一个新的元素之后发出一次这个信号。
    void lineWidthChanged(int width); // 改变线宽是发出这个信号
    void textSizeChanged(int size); // 改变文字大小时发出这个信号
    void mouseRightClick();
private:
    void drawElement(QPainter &painter);// 将每一个元素都画一遍
    void mouseLeftButtonPress(QPointF point);
    void mouseRightButtonPress(QPointF point);
    void setReferenceLine(int pos);

protected:
    void paintEvent(QPaintEvent *event)  Q_DECL_OVERRIDE;
    void mousePressEvent(QMouseEvent * event)  Q_DECL_OVERRIDE;
    void mouseReleaseEvent(QMouseEvent * event)  Q_DECL_OVERRIDE;
    void mouseMoveEvent( QMouseEvent * event)  Q_DECL_OVERRIDE;
    //void mouseDoubleClickEvent(QMouseEvent *event);

private:    
    enum Element::DrawType m_drawType;
    QPointF m_startPoint;
    QPen m_linePen;
    QFont m_textFont;
    QList<Element *> m_shapeList;
    Element *pcurrentShape;
    Element *pShapeFind;
    int m_ExtLine;

    DrawRuler m_ruler;
};

} //namespace Qly
#endif
